#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int fd; // 文件描述符
    const char *filePath = "bite";
    const char *contentToWrite = "i like linux!";
    char buffer[100]; // 用于存储从文件中读取的内容
    ssize_t bytesRead; // 记录read函数读取的字节数

    // 以读写模式打开文件，若文件不存在则创建（O_CREAT），并设置文件权限（0644）
    fd = open(filePath, O_RDWR | O_CREAT, 0644);
    if (fd == -1) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }

    // 将文件指针移至文件末尾，准备写入（实际上，由于使用了O_CREAT，此步骤在文件不存在时非必需）
    // 但为了演示lseek的使用，我们仍进行此操作
    if (lseek(fd, 0, SEEK_END) == (off_t)-1) {
        perror("Failed to seek in file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 向文件写入字符串
    if (write(fd, contentToWrite, strlen(contentToWrite)) == -1) {
        perror("Failed to write to file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 将文件指针重新定位到文件开头，以便读取
    if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
        perror("Failed to seek in file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 清空缓冲区
    memset(buffer, 0, sizeof(buffer));

    // 从文件读取内容至缓冲区
    bytesRead = read(fd, buffer, sizeof(buffer) - 1);
    if (bytesRead == -1) {
        perror("Failed to read from file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 打印读取到的内容至标准输出
    printf("Contents of file: %s\n", buffer);

    // 关闭文件描述符
    close(fd);

    return 0;
}